<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script>
			Object.prototype.toString.call(2) // "[object Number]"
			Object.prototype.toString.call('') // "[object String]"
			Object.prototype.toString.call(true) // "[object Boolean]"
			Object.prototype.toString.call(undefined) // "[object Undefined]"
			Object.prototype.toString.call(null) // "[object Null]"
			Object.prototype.toString.call(Math) // "[object Math]"
			Object.prototype.toString.call({}) // "[object Object]"
			Object.prototype.toString.call([]) // "[object Array]"
			
			var type = function (o){
			  var s = Object.prototype.toString.call(o);
			  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
			};
			
			type({}); // "object"
			type([]); // "array"
			type(5); // "number"
			type(null); // "null"
			type(); // "undefined"
			type(/abcd/); // "regex"
			type(new Date()); // "date"
			
			['Null',
			 'Undefined',
			 'Object',
			 'Array',
			 'String',
			 'Number',
			 'Boolean',
			 'Function',
			 'RegExp',
			 'NaN',
			 'Infinite'
			].forEach(function (t) {
			  type['is' + t] = function (o) {
			    return type(o) === t.toLowerCase();
			  };
			});
			
			type.isObject({}) // true
			type.isNumber(NaN) // true
			type.isRegExp(/abc/) // true
		</script>
	</body>
</html>
